package models

import (
	"crypto/md5"
	"encoding/hex"
	"io"
	"math/rand"
	"time"

	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
)

// 采用MD5对字符串加密
func PasswordMD5(password string) string {
	// 使用md5加密
	secret := md5.New()
	secret.Write([]byte(password))
	io.WriteString(secret, password)
	pwd := hex.EncodeToString(secret.Sum(nil))
	return pwd
}

//将字符串转换成time.Time类型
func String2Time(date string) (time.Time, error) {
	timeLayout := "2006-01-02"                                  //转化所需模板
	loc, _ := time.LoadLocation("UTC")                          //重要：获取时区
	theTime, err := time.ParseInLocation(timeLayout, date, loc) //使用模板在对应时区转化为time.time类型
	beego.Error(theTime)
	return theTime, err
}

// 检查电影信息
// 通过id获取相应电影
// 状态值信息：
// 0：电影存在
// 1：电影不存在
func CheckFilm(id int64) (*Film, int8) {
	o := orm.NewOrm()
	qs := o.QueryTable("film")
	filmid := new(Film)
	err := qs.Filter("id", id).One(filmid)
	if err != nil {
		return filmid, 1
	}
	return filmid, 0
}

// 通过用户id查询用户的订票信息
// 状态值信息：
// 0：查询成功
// 1：查询失败
func Checkuserorder(userid int64) ([]*Order, int64, int8) {
	o := orm.NewOrm()
	qs := o.QueryTable("order")
	orders := make([]*Order, 0)
	num, err := qs.Filter("Userid", userid).All(&orders)
	if err != nil {
		return nil, 0, 1
	}
	return orders, num, 0
}

// 状态值信息：
// 0：正常，有余坐
// 1：错误，无余坐
func Checkfilmseat(seatid int64) (*Seat, int8) {
	o := orm.NewOrm()
	qs := o.QueryTable("seat")
	// seats := make([]*Seat, 0)
	SEAT := new(Seat)
	err := qs.Filter("id", seatid).Filter("seatStatus", false).One(SEAT)
	if err != nil {
		return nil, 1
	}
	return SEAT, 0

}

//生成随机字符串
func GetRandomString(length int64) string {
	str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
	bytes := []byte(str)
	result := []byte{}
	var i int64
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
	for i = 0; i < length; i++ {
		result = append(result, bytes[r.Intn(len(bytes))])
	}
	return string(result)
}

// 状态值信息：
// 0：正常，获取id成功
// 1：错误，获取id失败
func Getuserid(name string) (int64, int8) {
	user, status := CheckUsr(name)
	if status == 0 {
		return user.Id, status
	}
	return 0, 1
}
